const express = require("express");
const router = express.Router();
const mailSend = require("../utils/mail")
const { sign } = require("../utils/jwt")
const  UserModel = require('../db/model/userModel');
const mailCodeModel = require("../db/model/mailCodeModel")
/**
 * @api {get} /user/reg 注册
 * @apiName /user/reg
 * @apiGroup user
 *
 * @apiParam {String} user 用户名邮箱.
 * @apiParam {String} pass 密码.
 * @apiParam {String} mailCode 验证码.
 *
 * @apiSuccess {String} msg  信息.
 * @apiSuccess {String} code 状态码.
 */
router.get("/reg",async (req,res) => {
  console.log("注册",req.query)
  // 获取get请求的数据
  const {user,pass, mailCode} = req.query;
  // 先判断验证码是否合法
  if(!mailCode || !user || !pass ) {
    return res.send({code:-3, msg: "参数缺失"})
  }
  // 判断验证码是否ok
  let isOk = await mailCodeModel.findOne({mail: user, mailCode: mailCode})

  if(!isOk) {
    return res.send({code: -4, msg: "验证码错误"})
  }


  // 先判断用户是否存在
  const isHave = await UserModel.findOne({user})
  if(isHave) {
    return res.send({code: -1, msg: "用户名重复"})
  }

  let result  = null
  // 通过try catch 捕获错误
  try {
    // 通过数据模型的方法 向users表插入数据
    result=  await UserModel.insertMany({user,pass})
  } catch (error) {
    res.send({code:-2, msg: "内部错误", error})
  }
  if(result) {
   return res.send({code:0,msg:"注册成功"})
  }
  res.send({code:-1, msg: "注册失败"})
})
/**
 * @api {post} /user/login 登录
 * @apiName /user/login
 * @apiGroup user
 *
 * @apiParam {String} user 用户名邮箱.
 * @apiParam {String} pass 密码.
 *
 * @apiSuccess {String} msg  信息.
 * @apiSuccess {String} code 状态码.
 */

router.post("/login",async(req,res) => {
  // 获取get请求的数据
  const {user,pass} = req.query;
  console.log(req.body)
  // 查询用户数据在数据库里是否存在
  const result = await UserModel.findOne( {user,pass})
  console.log(result) 
  
  if(!result)return res.send({code:-1,msg: "用户名密码错误"})
  // 产生token 
  const token = await sign({user: result.user, _id: result._id})
  if(!token) return res.send({code:-1, msg: "内部错误"})
  // 将产生的token更新到用户信息表
  const updateRes = await UserModel.updateOne({_id: result._id}, {$set: {token}})
  if(!updateRes) return res.send({code:-1, msg: "内部错误"})
  return res.send({code:0, msg: "登录OK", token})
  
})
/**
 * @api {post} /user/getMailCode 获取验证码
 * @apiName /user/getMailCode
 * @apiGroup user
 *
 * @apiParam {String} mail 用户名邮箱.
 *
 * @apiSuccess {String} msg  信息.
 * @apiSuccess {String} code 状态码.
 */

// 获取邮箱验证码
router.post("/getMailCode", async(req,res) => {
  const {mail} = req.body 
  if(!mail) return res.send({code:-1,msg:"参数错误"})
  const mailCode = parseInt(Math.random() * 10000)
  // 判断邮箱是否存在 存在更新code 不窜在新建
  const isHave = await mailCodeModel.findOne({mail})
  let r1 = null
  if(isHave) {
    // 更新
    // updateOne 第一个参数是条件 表示要修改那条数据
    // 第二个参数是修改的目标
    r1 = await mailCodeModel.updateOne({mail: mail},{ $set: {mailCode: mailCode}})
  } else  {
    // 将验证码和邮箱信息存起来
    r1 = await mailCodeModel.insertMany({mail, mailCode})
  }
  
  if(!r1)res.send({code:-1,msg:"内部错误",data:r1})
  const result = await mailSend.send(mailCode, mail)
  res.send({code:0,msg:"发送成功",res:result,mailCode})

})

module.exports = router